﻿//-----------------------------------------------------------------------
// <copyright file="ShotScore.cs" company="DylanBox">
// Copyright (c) DylanBox Corporation. All rights reserved.
// </copyright>
// <summary>Recurisve algorithm solve shot problem</summary>
// <reference>
//      http://www.cnblogs.com/lds85930/archive/2007/07/05/807198.html
// </reference>
// <author>Dylan</author>
//-----------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Recursive
{
    public class ShotScore
    {
        public static int sum;

        public static void Output(int[] store2)
        {
            for (int i = 9; i >= 0; --i)
            {
                Console.Write("   {0}", store2[i]);
            }

            Console.WriteLine();
            sum++;
        }

        //计算总数，返回sum值
        public static int sum2()
        {
            return sum;
        }

        /// <summary>
        /// 计算num枪，总分Score, 并且存储在Store2
        /// 递归过程是这样的：
        /// 　　　Cumput(90,9,store);  问题开始：10枪90环
        /// 　　　  Cumput(90,8,store); 第一枪打了0环，需要在余下9枪打90环 -------    [0,]
        /// 　　　      Cumput(90,7,store); 第二枪打了0环，需要在余下8枪打90环【不可能，退出】
        /// 　　　      Cumput(89,7,store); 第二枪打了1环，需要在余下8枪打89环【不可能，退出】
        /// 　　　      Cumput(88,7,store); 第二枪打了3环，需要在余下8枪打88环【不可能，退出】
        /// 　　　      ...
        /// 　　　      Cumput(80,7,store); 第二枪打了10环，需要在余下8枪打80环 ------ [0,10,]
        /// 　　　          Cumput(80,6,store); 第三枪打了0环，需要在余下7枪里打80环【不可能，退出】
        /// 　　　          ...
        /// 　　　          Cumput(70,6,store); 第三枪打了10环，需要在余下7枪里打70环 ------ [0,10,10,]
        /// 　　　              Cumput(70,5,store); 第四枪打了0环，需要在余下6枪里打70环【不可能，退出】
        /// 　　　              .........
        /// 　　　                第一个结果[0,10,10,10,10,10,10,10,10,10]
        /// 　　　   Cumput(89,8,store);  第一枪打了1环，需要在余下9枪打89环 -------    [1,]   
        /// 　　　      ...
        /// 
        /// </summary>
        /// <param name="score"></param>
        /// <param name="num"></param>
        /// <param name="store2"></param>
        public static void Cumput(int score, int num, int[] store2)
        {
            //如果总的成绩超过了90环（也就是score<0），或者如果剩下要打靶
            //的成绩大于10环乘以剩下要打的次数，也就是说即便后面的都打10环
            //也无法打够次数，则退出递归
            if (score < 0 || score > (num + 1) * 10) //次数num为0～9
            {
                return;
            }

            //如果满足条件且达到最后一层
            if (num == 0)
            {
                store2[num] = score;
                Output(store2);
                return;
            }

            for (int i = 0; i <= 10; ++i)
            {
                store2[num] = i;
                Cumput(score - i, num - 1, store2);
            }

            //Console.Write("   {0}",store2[5]);
        }

    }
}

